home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Online / SpeakFreely / src / lpc10 / pitsyn.c < prev    next >
C/C++ Source or Header  |  2000-05-18  |  4KB  |  184 lines

  1. /*******************************************************************
  2. *
  3. *    PITSYN Version 53
  4. *
  5. *******************************************************************
  6. *
  7. *   Synthesize a single pitch epoch
  8. *
  9. * Inputs:
  10. *  ORDER  - Synthesis order (number of RC's)
  11. *  VOICE  - Half frame voicing decisions
  12. *  PITCH  - Pitch
  13. *  RMS      - Energy
  14. *  RC      - Reflection coefficients
  15. *  LFRAME - Length of speech buffer
  16. * Outputs:
  17. *  IVUV   - Pitch epoch voicing decisions
  18. *  IPITI  - Pitch epoch length
  19. *  RMSI   - Pitch epoch energy
  20. *  RCI    - Pitch epoch RC's
  21. *  NOUT   - Number of pitch periods in this frame
  22. *  RATIO  - Previous to present energy ratio
  23. */
  24.  
  25. #include "config.ch"
  26. #include "lpcdefs.h"
  27. #include <math.h>
  28.  
  29.  
  30. pitsyn(voice, pitch, rms, rc, ivuv, ipiti, rmsi, rci, nout, ratio )
  31. int voice[], *pitch;
  32. int ivuv[], ipiti[], *nout;
  33. float *rms, rc[], rmsi[], rci[ORDER][11], *ratio;
  34. {
  35. static float rco[MAXORD], yarc[MAXORD];
  36. int i, j, lsamp, ip, istart, ivoice;
  37. static int ivoico=0, ipito=0;
  38. int jused, nl;
  39. static int jsamp;
  40. float alrn, alro, prop;
  41. static float rmso=0;
  42. float slope, uvpit, vflag, xxy;
  43. static short first=1;
  44.  
  45.  
  46.  
  47. if (*rms<1) *rms = 1;
  48. if (rmso<1) rmso = 1;
  49. uvpit = 0.0;
  50. *ratio = *rms/(rmso+8.);
  51.  
  52. if (first) {    /*1*/
  53.     lsamp = 0;
  54.     ivoice = voice[2];
  55.   if (ivoice==0) {
  56.     *pitch = LFRAME*0.25;
  57.   }
  58.     *nout = LFRAME/ *pitch;
  59.     jsamp = LFRAME - *nout * *pitch;
  60.     for(i=1;i<=*nout;i++)    {
  61.         for(j=1;j<=ORDER;j++)
  62.             rci[j-1][i-1] = rc[j];
  63.         ivuv[i] = ivoice;
  64.         ipiti[i] = *pitch;
  65.         rmsi[i] = *rms;
  66.     }
  67.     first = 0;
  68. } /*1*/
  69. else    { /*1*/
  70.     vflag = 0;
  71.     lsamp = LFRAME + jsamp;
  72.     slope = (*pitch-ipito)/(float)lsamp;
  73.     *nout = 0;
  74.     jused = 0;
  75.     istart = 1;
  76.     if ((voice[1]==ivoico)&&(voice[2]==voice[1])) { /*2*/
  77.         if (voice[2]==0) {
  78. /* SSUV - -   0  ,  0  ,  0    */
  79.             *pitch = LFRAME*0.25;
  80.             ipito = *pitch;
  81.             if( *ratio>8 ) rmso = *rms;
  82.         }
  83. /* SSVC - -   1  ,  1  ,  1    */
  84.         slope = (*pitch-ipito)/(float)lsamp;
  85.         ivoice = voice[2];
  86.     } /*2*/
  87.     else    { /*2*/
  88.         if (ivoico!=1) {
  89.             if (ivoico==voice[1])
  90. /* UV2VC2 - -  0  ,  0    ,  1    */
  91.                 nl = lsamp - LFRAME*0.25;
  92.             else
  93. /* UV2VC1 - -  0  ,  1    ,  1    */
  94.                 nl = lsamp - 3*LFRAME*0.25;
  95.  
  96.             ipiti[1] = nl*0.5;
  97.             ipiti[2] = nl - ipiti[1];
  98.             ivuv[1] = 0;
  99.             ivuv[2] = 0;
  100.             rmsi[1] = rmso;
  101.             rmsi[2] = rmso;
  102.             for(i=1;i<=ORDER;i++)    {
  103.                 rci[i-1][0] = rco[i-1];
  104.                 rci[i-1][1] = rco[i-1];
  105.                 rco[i-1]   = rc[i];
  106.             }
  107.             slope = 0;
  108.             *nout = 2;
  109.             ipito = *pitch;
  110.             jused = nl;
  111.             istart = nl + 1;
  112.             ivoice = 1;
  113.         }
  114.         else    {
  115.             if (ivoico!=voice[1]) 
  116. /* VC2UV1 - -    1  ,  0  ,  0    */
  117.                 lsamp = LFRAME*0.25 + jsamp;
  118.             else
  119. /* VC2UV2 - -    1  ,  1  ,  0    */
  120.                 lsamp = 3*LFRAME*0.25 + jsamp;
  121.  
  122.             for(i=1;i<=ORDER;i++)    {
  123.                 yarc[i-1] = rc[i];
  124.                 rc[i] = rco[i-1];
  125.             }
  126.             ivoice = 1;
  127.             slope = 0.;
  128.             vflag = 1;
  129.         }
  130.     } /*2*/
  131.  
  132.  
  133.     while (1)    {    /*3*/
  134.         for(i=istart;i<=lsamp;i++)    { /*4*/
  135.             ip = ipito + slope*i + .5;
  136.             if (uvpit!=0.0) ip = uvpit;
  137.             if (ip<=i-jused) { /*5*/    
  138.                 (*nout)++;
  139.                 if (*nout > 11) {
  140.                     exit(1);
  141.                 }
  142.                 ipiti[*nout] = ip;
  143.                 *pitch = ip;
  144.                 ivuv[*nout] = ivoice;
  145.                 jused += ip;
  146.                 prop = (jused-ip*0.5)/(float)lsamp;
  147.                 for(j=1;j<=ORDER;j++)    {
  148.                     alro = log((1+rco[j-1])/(1-rco[j-1]));
  149.                     alrn = log((1+rc[j])/(1-rc[j]));
  150.                     xxy = alro + prop*(alrn-alro);
  151.                     xxy = exp(xxy);
  152.                     rci[j-1][*nout-1] = (xxy-1)/(xxy+1);
  153.                 }
  154.                 rmsi[*nout]=log(rmso)+prop*(log(*rms)-log(rmso));
  155.                 rmsi[*nout] = exp(rmsi[*nout]);
  156.             }    /*5*/
  157.         } /*4*/
  158.         if (vflag!=1) break;
  159.         vflag = 0;
  160.         istart = jused + 1;
  161.         lsamp = LFRAME + jsamp;
  162.         slope = 0;
  163.         ivoice = 0;
  164.         uvpit = (lsamp-istart)*0.5;
  165.         if(uvpit>90) uvpit *= 0.5;
  166.         rmso = *rms;
  167.         for(i=1;i<=ORDER;i++)    {
  168.             rc[i] = yarc[i-1];
  169.             rco[i-1] = yarc[i-1];
  170.         }
  171.     }/*3*/
  172.     jsamp = lsamp - jused;
  173. } /*1*/
  174. if (*nout!=0) {
  175.     ivoico = voice[2];
  176.     ipito = *pitch;
  177.     rmso = *rms;
  178.     /*DO I = 1,ORDER */
  179.     for(i=1;i<=ORDER;i++)
  180.         rco[i-1] = rc[i];
  181. }
  182.  
  183. }
  184.